using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._SpatialAnalystTools._Hydrology
{
    /// <summary>
    /// <para>Storage Capacity</para>
    /// <para>Creates a table and a chart of elevations and corresponding storage capacities for an input surface raster. The tool calculates the surface area and total volume of the underlying region at a series of elevation increments.</para>
    /// <para>为输入表面栅格创建高程和相应存储容量的表和图表。该工具以一系列高程增量计算基础区域的表面积和总体积。</para>
    /// </summary>    
    [DisplayName("Storage Capacity")]
    public class StorageCapacity : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public StorageCapacity()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_surface_raster">
        /// <para>Input surface raster</para>
        /// <para>The input raster representing a continuous surface.</para>
        /// <para>表示连续表面的输入栅格。</para>
        /// </param>
        /// <param name="_out_table">
        /// <para>Output table</para>
        /// <para>The output table that contains for each zone the surface area and total volumes for each increment in elevation.</para>
        /// <para>输出表，其中包含每个区域的表面积和每个高程增量的总体积。</para>
        /// </param>
        public StorageCapacity(object _in_surface_raster, object _out_table)
        {
            this._in_surface_raster = _in_surface_raster;
            this._out_table = _out_table;
        }
        public override string ToolboxName => "Spatial Analyst Tools";

        public override string ToolName => "Storage Capacity";

        public override string CallName => "sa.StorageCapacity";

        public override List<string> AcceptEnvironments => ["autoCommit", "cellSize", "cellSizeProjectionMethod", "compression", "configKeyword", "extent", "geographicTransformations", "mask", "outputCoordinateSystem", "parallelProcessingFactor", "scratchWorkspace", "snapRaster", "tileSize", "workspace"];

        public override object[] ParameterInfo => [_in_surface_raster, _out_table, _in_zone_data, _zone_field, _analysis_type.GetGPValue(), _min_elevation, _max_elevation, _increment_type.GetGPValue(), _increment, _z_unit.GetGPValue(), _out_chart];

        /// <summary>
        /// <para>Input surface raster</para>
        /// <para>The input raster representing a continuous surface.</para>
        /// <para>表示连续表面的输入栅格。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input surface raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_surface_raster { get; set; }


        /// <summary>
        /// <para>Output table</para>
        /// <para>The output table that contains for each zone the surface area and total volumes for each increment in elevation.</para>
        /// <para>输出表，其中包含每个区域的表面积和每个高程增量的总体积。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output table")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_table { get; set; }


        /// <summary>
        /// <para>Input raster or feature zone data</para>
        /// <para><xdoc>
        ///   <para>The dataset that defines the zones.</para>
        ///   <para>The zones can be defined by an integer raster or a feature layer.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>定义区域的数据集。</para>
        ///   <para>区域可由整数栅格或要素图层定义。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input raster or feature zone data")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _in_zone_data { get; set; } = null;


        /// <summary>
        /// <para>Zone field</para>
        /// <para><xdoc>
        ///   <para>The field that contains the values that define each zone.</para>
        ///   <para>It can be an integer or a string field of the zone dataset.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>包含定义每个区域的值的字段。</para>
        ///   <para>它可以是区域数据集的整数或字符串字段。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Zone field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _zone_field { get; set; } = null;


        /// <summary>
        /// <para>Analysis type</para>
        /// <para><xdoc>
        ///   <para>Specifies the analysis type.</para>
        ///   <bulletList>
        ///     <bullet_item>Area and Volume—Both surface areas and total volumes are calculated at each elevation increment. This is the default.</bullet_item><para/>
        ///     <bullet_item>Area—Surface area is calculated at each elevation increment.</bullet_item><para/>
        ///     <bullet_item>Volume—Total volume is calculated at each elevation increment.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定分析类型。</para>
        ///   <bulletList>
        ///     <bullet_item>面积和体积 - 表面积和总体积均按每个高程增量计算。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>面积 - 按每个高程增量计算表面积。</bullet_item><para/>
        ///     <bullet_item>体积 - 按每个高程增量计算总体积。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Analysis type")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _analysis_type_value _analysis_type { get; set; } = _analysis_type_value._AREA_VOLUME;

        public enum _analysis_type_value
        {
            /// <summary>
            /// <para>Area and Volume</para>
            /// <para>Area and Volume—Both surface areas and total volumes are calculated at each elevation increment. This is the default.</para>
            /// <para>面积和体积 - 表面积和总体积均按每个高程增量计算。这是默认设置。</para>
            /// </summary>
            [Description("Area and Volume")]
            [GPEnumValue("AREA_VOLUME")]
            _AREA_VOLUME,

            /// <summary>
            /// <para>Area</para>
            /// <para>Area and Volume—Both surface areas and total volumes are calculated at each elevation increment. This is the default.</para>
            /// <para>面积和体积 - 表面积和总体积均按每个高程增量计算。这是默认设置。</para>
            /// </summary>
            [Description("Area")]
            [GPEnumValue("AREA")]
            _AREA,

            /// <summary>
            /// <para>Volume</para>
            /// <para>Volume—Total volume is calculated at each elevation increment.</para>
            /// <para>体积 - 按每个高程增量计算总体积。</para>
            /// </summary>
            [Description("Volume")]
            [GPEnumValue("VOLUME")]
            _VOLUME,

        }

        /// <summary>
        /// <para>Minimum elevation</para>
        /// <para><xdoc>
        ///   <para>The minimum elevation from which storage capacities are assessed.</para>
        ///   <para>By default, the tool uses the minimum surface raster value in each zone as the minimum elevation for that zone. If a value is provided, it is used as the minimum elevation across all zones.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>评估存储容量的最小高度。</para>
        ///   <para>默认情况下，该工具使用每个区域中的最小表面栅格值作为该区域的最小高程。如果提供了值，则该值将用作所有区域的最小高程。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Minimum elevation")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double? _min_elevation { get; set; } = null;


        /// <summary>
        /// <para>Maximum elevation</para>
        /// <para><xdoc>
        ///   <para>The maximum elevation from which storage capacities are assessed.</para>
        ///   <para>By default, the tool uses the maximum surface raster value in each zone as the maximum elevation for that zone. If a value is provided, it is used as the maximum elevation across all zones.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>评估存储容量的最大高程。</para>
        ///   <para>默认情况下，该工具使用每个区域中的最大表面栅格值作为该区域的最大高程。如果提供了某个值，则该值将用作所有区域的最大高程。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Maximum elevation")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double? _max_elevation { get; set; } = null;


        /// <summary>
        /// <para>Increment type</para>
        /// <para><xdoc>
        ///   <para>Specifies the increment type to use when computing elevation increments between minimum and maximum elevations.</para>
        ///   <bulletList>
        ///     <bullet_item>Number of Increments—The number of increments between minimum and maximum elevations is used. This is the default.</bullet_item><para/>
        ///     <bullet_item>Value of Increment—The elevation difference between each increment is used.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定在计算最小高程和最大高程之间的高程增量时要使用的增量类型。</para>
        ///   <bulletList>
        ///     <bullet_item>增量数 - 使用最小高程和最大高程之间的增量数。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>增量值 - 使用每个增量之间的高程差。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Increment type")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _increment_type_value _increment_type { get; set; } = _increment_type_value._NUMBER_OF_INCREMENTS;

        public enum _increment_type_value
        {
            /// <summary>
            /// <para>Number of Increments</para>
            /// <para>Number of Increments—The number of increments between minimum and maximum elevations is used. This is the default.</para>
            /// <para>增量数 - 使用最小高程和最大高程之间的增量数。这是默认设置。</para>
            /// </summary>
            [Description("Number of Increments")]
            [GPEnumValue("NUMBER_OF_INCREMENTS")]
            _NUMBER_OF_INCREMENTS,

            /// <summary>
            /// <para>Value of Increment</para>
            /// <para>Value of Increment—The elevation difference between each increment is used.</para>
            /// <para>增量值 - 使用每个增量之间的高程差。</para>
            /// </summary>
            [Description("Value of Increment")]
            [GPEnumValue("VALUE_OF_INCREMENT")]
            _VALUE_OF_INCREMENT,

        }

        /// <summary>
        /// <para>Increment</para>
        /// <para>An incremental value that is either the number of increments or the difference in elevation between increments. The value is determined based on the increment type parameter value.</para>
        /// <para>一个增量值，该值是增量的数量或增量之间的高程差。该值是根据增量类型参数值确定的。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Increment")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double? _increment { get; set; } = null;


        /// <summary>
        /// <para>Z unit</para>
        /// <para><xdoc>
        ///   <para>The linear unit of vertical z-values.</para>
        ///   <bulletList>
        ///     <bullet_item>Inch—The linear unit will be inches.</bullet_item><para/>
        ///     <bullet_item>Foot—The linear unit will be feet.</bullet_item><para/>
        ///     <bullet_item>Yard—The linear unit will be yards.</bullet_item><para/>
        ///     <bullet_item>Mile US—The linear unit will be miles.</bullet_item><para/>
        ///     <bullet_item>Nautical mile—The linear unit will be nautical miles.</bullet_item><para/>
        ///     <bullet_item>Millimeter—The linear unit will be millimeters.</bullet_item><para/>
        ///     <bullet_item>Centimeter—The linear unit will be centimeters.</bullet_item><para/>
        ///     <bullet_item>Meter—The linear unit will be meters.</bullet_item><para/>
        ///     <bullet_item>Kilometer—The linear unit will be kilometers.</bullet_item><para/>
        ///     <bullet_item>Decimeter—The linear unit will be decimeters.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>垂直 z 值的线性单位。</para>
        ///   <bulletList>
        ///     <bullet_item>英寸—线性单位将为英寸。</bullet_item><para/>
        ///     <bullet_item>英尺—线性单位为英尺。</bullet_item><para/>
        ///     <bullet_item>码—线性单位将为码。</bullet_item><para/>
        ///     <bullet_item>Mile US—线性单位将为英里。</bullet_item><para/>
        ///     <bullet_item>海里—线性单位为海里。</bullet_item><para/>
        ///     <bullet_item>毫米—线性单位将为毫米。</bullet_item><para/>
        ///     <bullet_item>厘米—线性单位将为厘米。</bullet_item><para/>
        ///     <bullet_item>米—线性单位将为米。</bullet_item><para/>
        ///     <bullet_item>公里—线性单位将为千米。</bullet_item><para/>
        ///     <bullet_item>分米—线性单位为分米。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Z unit")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _z_unit_value? _z_unit { get; set; } = null;

        public enum _z_unit_value
        {
            /// <summary>
            /// <para>Meter</para>
            /// <para>Meter—The linear unit will be meters.</para>
            /// <para>米—线性单位将为米。</para>
            /// </summary>
            [Description("Meter")]
            [GPEnumValue("METER")]
            _METER,

            /// <summary>
            /// <para>Inch</para>
            /// <para>Inch—The linear unit will be inches.</para>
            /// <para>英寸—线性单位将为英寸。</para>
            /// </summary>
            [Description("Inch")]
            [GPEnumValue("INCH")]
            _INCH,

            /// <summary>
            /// <para>Foot</para>
            /// <para>Foot—The linear unit will be feet.</para>
            /// <para>英尺—线性单位为英尺。</para>
            /// </summary>
            [Description("Foot")]
            [GPEnumValue("FOOT")]
            _FOOT,

            /// <summary>
            /// <para>Yard</para>
            /// <para>Yard—The linear unit will be yards.</para>
            /// <para>码—线性单位将为码。</para>
            /// </summary>
            [Description("Yard")]
            [GPEnumValue("YARD")]
            _YARD,

            /// <summary>
            /// <para>Mile US</para>
            /// <para>Mile US—The linear unit will be miles.</para>
            /// <para>Mile US—线性单位将为英里。</para>
            /// </summary>
            [Description("Mile US")]
            [GPEnumValue("MILE_US")]
            _MILE_US,

            /// <summary>
            /// <para>Nautical mile</para>
            /// <para>Nautical mile—The linear unit will be nautical miles.</para>
            /// <para>海里—线性单位为海里。</para>
            /// </summary>
            [Description("Nautical mile")]
            [GPEnumValue("NAUTICAL_MILE")]
            _NAUTICAL_MILE,

            /// <summary>
            /// <para>Millimeter</para>
            /// <para>Millimeter—The linear unit will be millimeters.</para>
            /// <para>毫米—线性单位将为毫米。</para>
            /// </summary>
            [Description("Millimeter")]
            [GPEnumValue("MILLIMETER")]
            _MILLIMETER,

            /// <summary>
            /// <para>Centimeter</para>
            /// <para>Centimeter—The linear unit will be centimeters.</para>
            /// <para>厘米—线性单位将为厘米。</para>
            /// </summary>
            [Description("Centimeter")]
            [GPEnumValue("CENTIMETER")]
            _CENTIMETER,

            /// <summary>
            /// <para>Kilometer</para>
            /// <para>Kilometer—The linear unit will be kilometers.</para>
            /// <para>公里—线性单位将为千米。</para>
            /// </summary>
            [Description("Kilometer")]
            [GPEnumValue("KILOMETER")]
            _KILOMETER,

            /// <summary>
            /// <para>Decimeter</para>
            /// <para>Decimeter—The linear unit will be decimeters.</para>
            /// <para>分米—线性单位为分米。</para>
            /// </summary>
            [Description("Decimeter")]
            [GPEnumValue("DECIMETER")]
            _DECIMETER,

        }

        /// <summary>
        /// <para>Output chart name</para>
        /// <para><xdoc>
        ///   <para>The name of the output chart for display.</para>
        ///   <para>The chart is listed in the Contents pane under Standalone Tables.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>要显示的输出图表的名称。</para>
        ///   <para>图表列在内容窗格的独立表下。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output chart name")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _out_chart { get; set; } = null;


        public StorageCapacity SetEnv(int? autoCommit = null, object cellSize = null, object compression = null, object configKeyword = null, object extent = null, object geographicTransformations = null, object mask = null, object outputCoordinateSystem = null, object parallelProcessingFactor = null, object scratchWorkspace = null, object snapRaster = null, double[] tileSize = null, object workspace = null)
        {
            base.SetEnv(autoCommit: autoCommit, cellSize: cellSize, compression: compression, configKeyword: configKeyword, extent: extent, geographicTransformations: geographicTransformations, mask: mask, outputCoordinateSystem: outputCoordinateSystem, parallelProcessingFactor: parallelProcessingFactor, scratchWorkspace: scratchWorkspace, snapRaster: snapRaster, tileSize: tileSize, workspace: workspace);
            return this;
        }

    }

}